IAM intro
В этом посте посмотрим, как работает IAM и как применять базовые политики.
Введение
IAM предназначен для контроля доступа к ресурсам. Ресурсы могуть быть разными. Это S3 bucket, SQS queue, Kafka topic, выписка из биллинга, статистика, grafana dashboard, логи и т.д. Мы всегда хотим обеспечить минимальный доступ к ресурсам и только тем, кому строго положено.
В этом состоит два важнейших принципа проектирования вычислительных систем:
Подготовка
Идем в NWS консоль и генерируем новый токен. Далее, экспортируем токен в консоль:
export NWS_API_TOKEN=eyJhbGciOiJ...
Проверяем токен:
nws ct
21 Apr 2024 13:41:35 MSK INFO ✅ Success! Token valid
Отлично! Токен активный и можем приступить к работе
Hello World - защита сервиса Friends при помощи IAM
IAM сервис представляет собой вспомогательную функцию авторизации, которая либо разрешает, либо запрещает доступ к ресурсу NWS для данного IAM пользователя или группы.
Для примера рассмотрим сервис Friends, который реализует простейший, но полновестный NWS API. API для сервиа доступен на понде.
Для начала скинем токен и попробуем получить доступ к API без авторизации:
unset NWS_API_TOKEN
nws fr list
2024/04/21 10:51:30.737 INFO rpc error: code = Unauthenticated desc = ❌ auth: access token is invalid or expired
Это ошибка аутентификации, т.е токен не рабочий.
Вернем токен и попробуем сделать list снова:
export NWS_API_TOKEN=eyJhbGciOiJ...
nws fr list
2024/04/21 10:50:04.150 INFO rpc error: code = PermissionDenied desc = ❌ auth: forbidden
Forbidden означает, что юзер авторизовался через токен, но у него нет прав на метод list у Friends API.
Во тут и начинается работа с IAM.
Добавление IAM Policy
Для начала, посмотрим, какие политики доступны для данного пользователя:
nws iam policy list
21 Apr 2024 13:56:45 MSK INFO ✅ Success! Found 0 policies
Из этого следует, что ВСЕ API для IAM User закрыты по умолчанию и каждый API или ресурс перед использованием нужно открывать при помощи IAM. Такое поведение - by design и соответствует AWS Best Practices для IAM Users.
tee friends.json <<EOF
{
"id": "t8hhkqr6",
"version": "0.0.1",
"description": "allow actions for the Friends service",
"active": true,
"statements": [
{
"sid": "16oq0d",
"effect": "allow",
"actions": ["friends:list", "friends:read", "friends:create"],
"resources": ["nrn:nws:friends:ru-msk-0a:*:*"],
"principals": ["*"]
}
]
}
EOF
Как видим, политика разрешает методы friends:list, friends:read и friends:create для всех пользователей и IAM Groups внутри зоны ru-msk-0a.
Применяем политику:
nws iam p c --config ./friends.json
21 Apr 2024 14:10:30 MSK INFO ✅ Success! Policy added
И снова пробуем метод list сервиса Friends:
nws fr list
21 Apr 2024 14:12:16 MSK INFO ✅ Success! No friends found. Wanna add more ?
Теперь попробуем вызвать метод, который политика НЕ разрешила. Например, nuke:
nws fr nuke
2024/04/21 11:13:51.304 INFO rpc error: code = PermissionDenied desc = ❌ auth: forbidden
Эпилог
В NWS аунтификация реализована через токен, а авторизация - через IAM Policy. В то время, как аутентификация позволяет ответить на вопрос: КТО ВЫ?, авторизация отвечает на вопрос: ЧТО вам разрешено делать?.
По умолчанию, все сервисы NWS недоступны для IAM Users, что отвечает лучшим практикам AWS и Google Cloud.
Для того, чтобы API стал доступным, нужно добавить IAM Policy и указать методы, ресурсы и доверителей, которые могут получить доступ к вашему ресурсы или API.